/*
 * @Description  : Common definitions include pin assigns
 * @Version      : 0.1
 * @Company      : V-Think Development Team
 * @Author       : KiraVerSace@yeah.net
 * @Date         : 2020-07-08 16:55:12
 * @LastEditTime : 2023-07-18 16:30:52
 */
#ifndef __X_COMMON_H__
#define __X_COMMON_H__

#include <xCode.h>
#include <Arduino.h>
#include <Wire.h>
#include <SPI.h>
#include <IWatchdog.h>

/*
 * 不会因为除了掉电以外的任何复位而清零
 * 可以用来统计软复位的次数
 */
extern void rebootSystem(void);
extern void delayWithLED(uint32_t ms);

extern void     xCommonInit(void);
extern void     xScreenPeriphInit(void);

#include <xMetaData.h>
extern bool     loadReadOnlyArea(void);

extern bool     setOTABootLoaderVersion(void);
extern uint8_t  readOTAJumpToApplicationTryCount(void);
extern bool     setOTAJumpToApplicationTryCount(void);
extern bool     clearOTAJumpToApplicationTryCount(void);

extern bool     setOTAUpgradeFlag (enum OTAUpgradeFlag upgradeFlag);
extern uint8_t  readOTAUpgradeFlag(void);
extern uint16_t readOTAFirmwareUrl(uint8_t *url);   // 读取OTA的升级地址
extern bool     setOTAFirmwareCRCValue(const uint32_t crcValue);
extern uint32_t readOTAFirmwareCRCValue(void);


extern bool     setOTANotifyFlag(void);     // 用于通知Application这是经过OTA更新过的程序

extern uint8_t  readOTAUpgradeFromApplicationTryCount(void);        // 读取从Application中下发OTA-Url尝试升级的次数
extern bool     setOTAUpgradeFromApplicationTryCount(bool status);  // true=次数+1 false=次数清零


/*----------------- Pin Assign -----------------*/
extern volatile int32_t  xBuzzer;       // PA15[OLD] PB14[NEW]

/*------------- Periph Module -----------*/
const int32_t  LED   		= PB0;

/*----------------- FRAM ----------------*/
const int32_t  FRAM_CS   	= PA4;
const int32_t  FRAM_MOSI 	= PA7;
const int32_t  FRAM_MISO 	= PA6;
const int32_t  FRAM_SCK  	= PA5;

const uint32_t FRAM_PARA_UNINIT		    = 0;
const uint32_t FRAM_PARA_UPDATE   	    = 0x55AAA55A;   // 参数区域需要更新
const uint32_t FRAM_PARA_NO_UPDATE 	    = 0xAA555AA5;   // 参数区域无需更新
/*
 *┌───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
 *│          Total [131072 Bytes]                Reserved Address[Start 79396]       [DEC]                                │
 *├─────────┬──────────┬───────────┬──────────┬──────────┬──────────┬───────────┬─────────┬────────┬──────────┬───────────┤
 *│StartAddr│    1     │    2049   │   4097   │  24577   │  45057   │   65537   │  75808  │ 75810  │  75812   │  77777    │
 *├─────────┼──────────┼───────────┼──────────┼──────────┼──────────┼───────────┼─────────┼────────┼──────────┼-──────────┤
 *│Size     │   2KB    │    2KB    │   20KB   │  20KB    │  20KB    │   10KB    │  2Byte  │ 2Byte  │ 512Byte  │  1KB      │
 *├─────────┼──────────┼───────────┼──────────┼──────────┼──────────┼───────────┼─────────┼────────┼──────────┼───────────┤
 *│         │ Parameter│ Parameter │ LTE      │ FG       │ Water    │  BeiDou   │ OTA     │ OTA    │ Firmware │ System    │
 *│Intro    │          │ Backup    │ DataBase │ DataBase │ DataBase │  DataBase │ Upgrade │ Notify │ Url      │ Read Only │
 *└─────────┴──────────┴───────────┴──────────┴──────────┴──────────┴───────────┴─────────┴────────┴──────────┴───────────┘
 */
const uint32_t FRAM_PARA_SIZE           = 2*1024;                               // 参数区域大小
const uint32_t FRAM_PARA_ADDR_START     = 1;                                    // [1-2048]   系统参数的起始地址
const uint32_t FRAM_PARA_BAK_ADDR_START = FRAM_PARA_ADDR_START+FRAM_PARA_SIZE;  // [2049-4096]系统参数备份区域的起始地址

const uint32_t FRAM_LTE_DB_ADDR_START   = FRAM_PARA_BAK_ADDR_START+FRAM_PARA_SIZE;
const uint32_t FRAM_LTE_DB_TOTAL_SIZE   = 20*1024;                             // [20KB]环形缓冲数据分配空间大小
const uint32_t FRAM_FG_DB_ADDR_START    = FRAM_LTE_DB_ADDR_START+FRAM_LTE_DB_TOTAL_SIZE;
const uint32_t FRAM_FG_DB_TOTAL_SIZE    = 20*1024;                             // [20KB]环形缓冲数据分配空间大小
const uint32_t FRAM_WATER_DB_ADDR_START = FRAM_FG_DB_ADDR_START+FRAM_FG_DB_TOTAL_SIZE;
const uint32_t FRAM_WATER_DB_TOTAL_SIZE = 20*1024;                             // [20KB]环形缓冲数据分配空间大小
const uint32_t FRAM_BDS_DB_ADDR_START   = FRAM_WATER_DB_ADDR_START+FRAM_WATER_DB_TOTAL_SIZE;
const uint32_t FRAM_BDS_DB_TOTAL_SIZE   = 10*1024;                             // [10KB]环形缓冲数据分配空间大小

const uint32_t FRAM_DC_DB_ADDR_START    = 81920;
const uint32_t FRAM_DC_DB_TOTAL_SIZE    = 2*1024;                              // [2KB]用于缓存zWater或者BD的5分钟数据

#define OTA_DEFAULT_CODE        0x11    // OTA两个寄存器的默认值
#define OTA_UPGRADE_ORIGIN_CODE 0x33    // 当需要进行OTA升级,从默认地址下载固件升级
#define OTA_UPGRADE_APP_CODE    0x55    // 当需要进行OTA升级,从APP下发的地址下载固件升级
#define OTA_NOTIFY_CODE         0xAA    // BootLoader成功升级后,将NOTIFY寄存器置位,由BootLoader去控制
#define OTA_NOTIFY_CLEAR_CODE   0xBB    // 当正确运行用户程序时,则将NOTIFY寄存器复位,可以是任意值,APP先读取再置位

/* [2Byte]记录BootLoader的版本号 */
const uint32_t FRAM_OTA_BL_VER              = FRAM_BDS_DB_ADDR_START + FRAM_BDS_DB_TOTAL_SIZE + 25;
/* [1Byte]记录是否跳转Application的尝试次数 */
const uint32_t FRAM_OTA_JUMP_TRY_COUNT      = FRAM_BDS_DB_ADDR_START + FRAM_BDS_DB_TOTAL_SIZE + 27;
/* [1Byte]记录尝试用Application下发的OTA地址升级的次数,超过一定次数则使用默认地址 */
const uint32_t FRAM_OTA_UPGRADE_TRY_COUNT   = FRAM_OTA_JUMP_TRY_COUNT + 1;

/* [2Byte]存放APP通知BootLoader进行升级的标志 */
const uint32_t FRAM_OTA_UPGRADE_ADDR_START  = FRAM_BDS_DB_ADDR_START + FRAM_BDS_DB_TOTAL_SIZE + 31;
/* [2Byte]存放BootLoader通知APP升级成功的标志 */
const uint32_t FRAM_OTA_NOTIFY_ADDR_START   = FRAM_OTA_UPGRADE_ADDR_START + 2;
/* [512Byte]存放OTA固件地址 */
const uint32_t FRAM_OTA_FIRMWARE_ADDR_START = FRAM_OTA_NOTIFY_ADDR_START  + 2;      // 其后的512个字节不可入侵占用
const uint32_t FRAM_OTA_FIRMWARE_URL_SIZE   = 512;                                  // 升级固件的地址大小
/* [4Byte] 存放OTA固件CRC校验码 */
const uint32_t FRAM_OTA_FIRMWARE_CRC_START  = FRAM_OTA_FIRMWARE_ADDR_START + 520;   // 本应该512间隔8个字节改成520
const uint32_t FRAM_OTA_FIRMWARE_CRC_SIZE   = 4;                                    // 升级固件的地址大小

/* [512Byte]存放只读参数区,绑定设备无法更改 */
const uint32_t FRAM_AREA_READ_ONLY_START = 77777;   // 其后的512个字节不可入侵占用

/*-------------- Third Library ---------------*/
#include <log.h>

#include <Adafruit_FRAM_SPI.h>
extern SPIClass          framSPI;
extern Adafruit_FRAM_SPI fram;		    // FML_FRAM

/*--------------- TFT_ST7735 -----------------*/
#include <FastCRC.h>

#ifdef ULTIMATE
    #include <TFT_ST7789.h>
#endif

#ifdef SIMPLE
    #include <TFT_ST7735.h>
#endif


#include <LTE_Cat1_GM5.h>
#define LTE_UART 	Serial3		// TTL
const 	int32_t 	LTE_PWR 	= PC13;

#endif
